package 集合.泛型;

import java.util.ArrayList;

public class 泛型的继承和通配符 {
    /*
    应用场景：
    1.如果我们在定义类、方法、接口的时候，如果类型不确定，就可以定义泛型类、泛型方法、泛型接口
    2.如果类型不确定，但是知道以后只能传递某个继承体系中的，就可以使用泛型的通配符
    泛型的通配符：
    可以限定类型的范围
     */
    /*
    public static void main(String[] args) {
//    泛型不具备继承性，但是数据集具备继承性
        ArrayList<ye>  list1=new ArrayList<>();
        ArrayList<fu>  list2=new ArrayList<>();
        ArrayList<zi>  list3=new ArrayList<>();
        ArrayList<studnt> list4=new ArrayList<>();
//        调用method方法 ArrayList<ye> list   只能传递ye类
        method(list1);
//        以下就是泛型不具备继承性
        method(list2);
        method(list3);
//        数据具备继承性
        list1.add(new fu());
        list1.add(new zi());
        list1.add(new ye());


//       ArrayList<E> list/ArrayList<?> list      可以传递所有类型
        method1(list1);
        method1(list2);
        method1(list3);
        method1(list4);

//        ArrayList<? extends E>     可以传递E或者E所有的子类类型
        method3(list1);
        method3(list2);
        method3(list3);
        method3(list4);
//        <? super E>          以下方法表示可以传递E或者E所有父类的类型
        method4(list1);
        method4(list2);
        method4(list3);
        method4(list4);


    }
//    泛型里写的是什么类型只能传递什么类型    下面写的 <ye>就只能传递list1
//    如果使用泛型方法有个弊端，就是可以接受任意类型的数据
//    以下为泛型方法:
    public static <E> void method1(ArrayList<E> list){}
//    另一种泛型方式
    public static  void method2(ArrayList<?> list){}
    public static void method(ArrayList<ye> list){}
//    泛型的通配符
//   <? extends E> 该方法可以传递E或者E所有的子类类型
    public static void method3(ArrayList<? extends ye> list){}
//   <? super E>以下方法表示可以传递E或者E所有父类的类型
    public static void method4(ArrayList<? super fu> list){}
}
class ye{}
class fu extends ye{}
class zi extends fu{}
class studnt{}

     */
}